﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//X86环境 ⼩端字节序 
int main()
{
	int a[4] = { 1, 2, 3, 4 };
	int* ptr1 = (int*)(&a + 1);
	int* ptr2 = (int*)((int)a + 1);
	printf("%x, %x", ptr1[-1], *ptr2);
	//%x是以16进制的形式打印数据
	return 0;
}
#include <stdio.h>
int main()
{
	int n = 9;
	float* pFloat = (float*)&n;
	printf("n的值为：%d\n", n);//9
	printf("*pFloat的值为：%f\n", *pFloat);

	*pFloat = 9.0;
	printf("n的值为：%d\n", n);
	printf("*pFloat的值为：%f\n", *pFloat);//9.0000
	return 0;
}
#include<stdio.h>
int main()
{
	float f = 9.5f;
	//1001.1 -> 1.0011 * 2^3 -> (-1)^0 * 1.0011 * 2^3
	//S = 0    M = 1.0011    E = 3   存放是3要+127
	//0 10000010 00110000000000000000000
	//01000001 00011000 00000000 00000000
	//0x41     18       00       00
	return 0;
}
#include <stdio.h>
int main()
{
	int n = 9;//整数存储方式
	//00000000 00000000 00000000 00001001
	float* pFloat = (float*)&n;
	printf("n的值为：%d\n", n);//9
	//0 00000000 00000000000000000001001
	//E=全0
	//(-1)^0 * 0.00000000000000000001001 * 2^-126
	//百分号f打印小数点后六位全是0
	printf("*pFloat的值为：%f\n", *pFloat);

	*pFloat = 9.0;//浮点数存储方式
	//9.0 -> 1001.0 -> (-1)^0 * 1.001 * 2^3
	//S=0   E=3   M=1.001
	//0 10000010 00100000000000000000000
	printf("n的值为：%d\n", n);//上面的二进制看为补码并且打印，数很大很大
	printf("*pFloat的值为：%f\n", *pFloat);//9.0
	return 0;
}
#include <stdio.h>
int main()
{
    int a = 0x11223344;
    char* pc = (char*)&a;
    *pc = 0;
    printf("%x\n", a);
    return 0;
}
#include <stdio.h>
int main()
{
	int a = 0x11223344;

	return 0;
}
#include<stdio.h>
int main()
{
	int a = 1;
	if (*(char*)&a == 1)
		printf("小端\n");
	else 
		printf("大端\n");
	return 0;
}
#include <stdio.h>
int main()
{
	char a = -1;
	/*char类型默认是signed char类型,同时将-1换成二进制表示
	10000000 00000000 00000000 00000001 -1原码
	取反，+1
	11111111 11111111 11111111 11111111 -1补码
	我们知道这是整型类型四个字节32个bit位存储的结果，但是我们这里是char类型
	所以a中实际存储的是11111111，我们用%d来打印a便会发生整型提升
	因为其是signed类型的便补符号位
	11111111 11111111 11111111 11111111 补码
	取反，+1
	10000000 00000000 00000000 00000001 原码
	于是a便打印出了-1*/
	signed char b = -1;
	unsigned char c = -1;
	/*还是先写出-1的原码
	10000000 00000000 00000000 00000001 -1原码
	取反，+1
	11111111 11111111 11111111 11111111 -1补码
	c中实际存储的是11111111，接下来会发生整型提升
	因为其实unsigned类型的，于是补0
	00000000 00000000 00000000 11111111 unsigned类型原码、反码、补码相同
	计算这个数结果就是255，故c = 255*/
	printf("a = %d, b = %d, c = %d", a, b, c);
	return 0;
}
#include <stdio.h>
int main()
{
	char a = -128;
	/*char默认是signed char
	依旧先写出-128的原码
	10000000 00000000 00000000 10000000  -128原码
	取反，+1
	11111111 11111111 11111111 10000000  -128补码
	a中实际存储的是 10000000，接下来进行整型提升
	11111111 11111111 11111111 10000000 补码
	很明显这是一个超级大的数字，我们知道这一点就好了*/
	printf("%u\n", a);
	//%u是以10进制的形式打印无符号的整数(内存中存储的是无符号整数的补码)
	return 0;
}
#include <stdio.h>
int main()
{
	char a = 128;
	/*char默认是signed char
	依旧先写出128的原码
	00000000 00000000 00000000 10000000  128原码
	取反，+1
	11111111 11111111 11111111 10000000  128补码
	a中实际存储的是 10000000，接下来进行整型提升
	11111111 11111111 11111111 10000000 补码
	因为其是%u来打印即无符号整数，所以原码与补码相同
	很明显这是一个超级大的数字，我们知道这一点就好了*/
	printf("%u\n", a);
	return 0;
}